
package com.bsoft.gol.hcs.posterUtil;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * 批量下载二维码
 */
@Controller
@RequestMapping(value = "/qr")
public class DownloadQrController {
    private static final Logger logger = LoggerFactory.getLogger(DownloadQrController.class);

    @Autowired
    private PosterUtil posterUtil;


    //二维码存放地址
//    @Value("${base_qr_dir}")
//    private String base_qr_dir;
    @RequestMapping(value = "/downloadQr")
    @ResponseBody
    public void index(@RequestBody List<DoctorInfo> doctorInfoList, HttpServletRequest req, HttpServletResponse response) throws Exception {
        String basepath=req.getServletContext().getRealPath("/uploadFile");
        logger.info("二维码存放地址path："+basepath);

        List<String> paths = new ArrayList<>();

        if(doctorInfoList!=null && doctorInfoList.size()>0){

            for (DoctorInfo info :doctorInfoList){

                logger.info("二维码存放地址realPath："+basepath);
                File file = new File(basepath+ File.separator+"uploadFile"+ File.separator+info.getLocalDoctorId()+".png");

                generateQRCodeImage(info.getUrl(),200,200,file);

                String  filepath =   posterUtil.drawImg(basepath,file, info.getDoctorName()+"（"+info.getLocalDoctorId()+")"+info.getDoctorLevel()
                        , info.getOrgName(),new File(basepath+ File.separator+"bgimg.png"),info);
                paths.add(filepath);

            }


        }

        if (paths.size() != 0) {
            // 创建临时路径,存放压缩文件
            String filename ="qr-"+System.currentTimeMillis()+".zip";
            String zipFilePath = basepath+ File.separator+"zip"+ File.separator+filename;
            // 压缩输出流,包装流,将临时文件输出流包装成压缩流,将所有文件输出到这里,打成zip包
            ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath));
            // 循环调用压缩文件方法,将一个一个需要下载的文件打入压缩文件包
            for (String path : paths) {
                // 该方法在下面定义
                fileToZip(path, zipOut);
            }
            // 压缩完成后,关闭压缩流
            zipOut.close();

            //拼接下载默认名称并转为ISO-8859-1格式
            String fileName = new String((filename).getBytes(),"ISO-8859-1");
            response.setHeader("Content-Disposition", "attchment;filename="+fileName);

            //该流不可以手动关闭,手动关闭下载会出问题,下载完成后会自动关闭
            ServletOutputStream outputStream = response.getOutputStream();
            FileInputStream inputStream = new FileInputStream(zipFilePath);
            // 如果是SpringBoot框架,在这个路径
            // org.apache.tomcat.util.http.fileupload.IOUtils产品
            // 否则需要自主引入apache的 commons-io依赖
            // copy方法为文件复制,在这里直接实现了下载效果
            IOUtils.copy(inputStream, outputStream);

            // 关闭输入流
            inputStream.close();

            //下载完成之后，删掉这个zip包
            File fileTempZip = new File(zipFilePath);
            fileTempZip.delete();
        }



    }


    public static void fileToZip(String filePath,ZipOutputStream zipOut) throws IOException {
        // 需要压缩的文件
        File file = new File(filePath);
        // 获取文件名称,如果有特殊命名需求,可以将参数列表拓展,传fileName
        String fileName = file.getName();
        FileInputStream fileInput = new FileInputStream(filePath);
        // 缓冲
        byte[] bufferArea = new byte[1024 * 10];
        BufferedInputStream bufferStream = new BufferedInputStream(fileInput, 1024 * 10);
        // 将当前文件作为一个zip实体写入压缩流,fileName代表压缩文件中的文件名称
        zipOut.putNextEntry(new ZipEntry(fileName));
        int length = 0;
        // 最常规IO操作,不必紧张
        while ((length = bufferStream.read(bufferArea, 0, 1024 * 10)) != -1) {
            zipOut.write(bufferArea, 0, length);
        }
        //关闭流
        fileInput.close();
        // 需要注意的是缓冲流必须要关闭流,否则输出无效
        bufferStream.close();
        // 压缩流不必关闭,使用完后再关
    }



    private static void generateQRCodeImage(String text, int width, int height, File file) throws WriterException, IOException {
        QRCodeWriter qrCodeWriter = new QRCodeWriter();

        BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);

        MatrixToImageWriter.writeToFile(bitMatrix, "PNG", file);

    }


}
